package modelLayer;
import java.util.ArrayList;

import ExceptionsPakke.NoSuchUdlejningException;

/**
 * UdlejningsKartotek er en container for objekter af klassen udlejning, den er lavet i en singleton form.
 * 
 * @author Gruppe 2
 * @version 0.1
 */
public class UdlejningsKartotek
{
    // instance variables - replace the example below with your own
    private ArrayList<Udlejning> mineUdlejninger;
    private static UdlejningsKartotek instance;

    /**
     * Constructor for objekter af klassen UdlejningsKartotek, den er privat da vi bruger singleton metode
     */
    private UdlejningsKartotek()
    {
        mineUdlejninger = new ArrayList<Udlejning>();
    }

    /**
     * En metode til at tjekke om en instans af UdlejningsKartotek eksistere, hvis ikke bliver en skabt.
     * @return UdlejningKartotek instance.
     */
    public static UdlejningsKartotek getInstance()
    {
        if(instance == null)
        {
            instance = new UdlejningsKartotek();
        }
        return instance;
    }

    /**
     * En metode for at tilføje objekter af klassen Udlejning til vores ArrayList mineUdlejninger, har beskyttelse mod
     * tilføjelsen af 2 udlejninger med samme id
     * @param Udlejning u
     */
    public void addUdlejning(Udlejning u)
    {
        if(checkId(u) == false)
        {
            mineUdlejninger.add(u);
        }
        else
        {
            System.out.println("Du kan ikke tilføje 2 udlejninger med samme id");
        }

    }

    /**
     * En metode skabt til at finde specifikke objekter af Udlejning, i vores ArrayList mineUdlejninger, bliver
     * brugt i senere metoder
     * @param long id
     * @return Udlejning u
     */
    public Udlejning findUdlejning(long id)
    {
        int index = 0;
        boolean searching = true;
        while(searching == true && mineUdlejninger.size()>index)
        {
            Udlejning u = mineUdlejninger.get(index);
            if(u.getId()==id)
            {
                searching = false;
            }
            else
            {
                index++;
            }
        }
        if(!searching)
        {
            return mineUdlejninger.get(index);
        }
        else
        {
            return null;
        }
    }

    /**
     * En metode til at opdatere udlejning, bruger en try and catch til at beskytte mod forsøg på
     * at opdatere objekter som ikke eksistere
     * 
     * @param long id
     * @param String tidsperiode
     * @param String beskrivelse
     * @param int pris
     * @return boolean opdaterUdlejning
     */
    public void opdaterUdlejning(long id, long nyId, String tidsperiode, String beskrivelse, int pris) 
    		throws NoSuchUdlejningException
    {
          
                Udlejning u = findUdlejning(id);
                if(u != null)
                {
                	u.setId(nyId);
                	u.setTidsperiode(tidsperiode);
                	u.setBeskrivelse(beskrivelse);
                	u.setPris(pris);
                }
                else
                {
                	throw new NoSuchUdlejningException("Udlejningen findes ikke");
                }
    }

    /**
     * En metode skabt til at slette udlejninger fra vores ArrayList mineUdlejninger, har en try and catch
     * til at beskytte mod forsøg på at slette objekter som ikke findes
     * @param long id
     * @return boolean sletUdlejning
     */
    public void sletUdlejning(long id) throws NoSuchUdlejningException
    {
    	Udlejning u = findUdlejning(id);
    	if(u != null)
    	{
    		mineUdlejninger.remove(u);
    	}
    	else
    	{
    		throw new NoSuchUdlejningException("Udlejningen findes ikke");
    	}
     
    }

    /**
     * En metode some samler information vedrørende udlejninger og gemmer dem i en ArrayList til senere brug
     * @return ArrayList<String> print
     */
    public ArrayList<String> printUdlejningsKartotek()
    {
        ArrayList<String> print = new ArrayList<String>();
        for(Udlejning u: mineUdlejninger)
        {
            print.add("\n"+"ID: "+Long.toString(u.getId())+"\n");
            print.add("Tidsperiode: "+u.getTidsperiode()+"\n");
            print.add("Beskrivelse: "+u.getBeskrivelse()+"\n");
            print.add("Pris: "+Integer.toString(u.getPris())+"\n");
            print.add("\n");
        }
        return print;
    }

    /**
     * En metode some tjekker om en udlejning med samme id allerede findes i vores ArrayList
     * hvis den finder en udksriver den en besked om at man ikke kan tilføje 2 med samme.
     * @param Udlejning u
     * @return boolean found
     */
    public boolean checkId(Udlejning u)
    {
        boolean found = false;
        int index = 0;
        while(index < mineUdlejninger.size())
        {
            Udlejning uId = mineUdlejninger.get(index);
            if(u.getId() != uId.getId())
            {
                found = false;
                index++;
            }
            else
            {
                found = true;
                index++;
            }
        }
        return found;
    }
}
